/**
 * 数据连接器表单修改验证脚本
 * 用于验证重构后的代码是否正确工作
 */

// 模拟Vue组件的ref和reactive
const mockRef = (value) => ({ value })
const mockReactive = (obj) => obj

/**
 * 模拟DataConnectorForm组件的onSubmit方法（新版本）
 */
function mockNewOnSubmit(formData) {
	console.log('=== 新版本 onSubmit 方法测试 ===')
	
	// 模拟新的提交逻辑
	const submitData = {
		...formData.value,
		config: formData.value.config
	}
	
	console.log('提交数据:', JSON.stringify(submitData, null, 2))
	
	// 验证数据结构
	const isValidStructure = typeof submitData.config === 'object' && 
		!submitData.config.hasOwnProperty('config')
	
	console.log('数据结构验证:', isValidStructure ? '✅ 通过' : '❌ 失败')
	
	return { submitData, isValid: isValidStructure }
}

/**
 * 模拟DataConnectorForm组件的onSubmit方法（旧版本，用于对比）
 */
function mockOldOnSubmit(formData) {
	console.log('=== 旧版本 onSubmit 方法测试 ===')
	
	// 模拟旧的提交逻辑
	const submitData = {
		...formData.value,
		config: {
			config: JSON.stringify(formData.value.config)
		}
	}
	
	console.log('提交数据:', JSON.stringify(submitData, null, 2))
	
	// 验证数据结构
	const isOldStructure = typeof submitData.config === 'object' && 
		typeof submitData.config.config === 'string'
	
	console.log('旧数据结构验证:', isOldStructure ? '✅ 是旧结构' : '❌ 不是旧结构')
	
	return { submitData, isOldStructure }
}

/**
 * 模拟DataConnectorForm组件的open方法（新版本）
 */
function mockNewOpen(data) {
	console.log('=== 新版本 open 方法测试 ===')
	
	// 模拟新的数据处理逻辑
	const processedConfig = data.config || {}
	
	const formData = {
		...data,
		config: processedConfig
	}
	
	console.log('处理后的表单数据:', JSON.stringify(formData, null, 2))
	
	// 验证数据处理
	const isValidProcessing = typeof formData.config === 'object' && 
		formData.config === data.config
	
	console.log('数据处理验证:', isValidProcessing ? '✅ 通过' : '❌ 失败')
	
	return { formData, isValid: isValidProcessing }
}

/**
 * 模拟ExternalAPIConnectorForm组件的getConfigValue方法（新版本）
 */
function mockNewGetConfigValue(modelValue, key, defaultValue) {
	console.log('=== 新版本 getConfigValue 方法测试 ===')
	
	// 模拟新的配置获取逻辑
	const config = modelValue.config || {}
	const result = config[key] || defaultValue
	
	console.log(`获取配置 ${key}:`, result)
	
	// 验证配置获取
	const isValidGet = config.hasOwnProperty(key) ? config[key] === result : result === defaultValue
	
	console.log('配置获取验证:', isValidGet ? '✅ 通过' : '❌ 失败')
	
	return { result, isValid: isValidGet }
}

/**
 * 创建测试数据
 */
function createTestData() {
	return {
		// MySQL连接器测试数据
		mysql: mockRef({
			name: 'MySQL测试连接器',
			type: 'MYSQL',
			description: 'MySQL连接器测试',
			config: {
				host: 'localhost',
				port: '3306',
				database: 'test_db',
				username: 'root',
				password: 'password',
				params: 'useSSL=false&serverTimezone=Asia/Shanghai'
			}
		}),
		
		// 外部API连接器测试数据
		externalAPI: mockRef({
			name: '外部API测试连接器',
			type: 'EXTERNAL_API',
			description: '外部API连接器测试',
			config: {
				baseUrl: 'https://api.example.com',
				authType: 'BEARER_TOKEN',
				timeout: '30000',
				retryCount: '3',
				auth_token: 'test_token',
				auth_prefix: 'Bearer ',
				apis: JSON.stringify([
					{ path: '/users', method: 'GET', description: '获取用户列表' }
				])
			}
		}),
		
		// 本地API连接器测试数据
		localAPI: mockRef({
			name: '本地API测试连接器',
			type: 'LOCAL_API',
			description: '本地API连接器测试',
			config: {
				scanModules: JSON.stringify(['dashboard', 'sys']),
				onlyGetMethods: 'true',
				enablePermissionCheck: 'true',
				excludeSystemApis: 'true',
				excludePaths: JSON.stringify([]),
				cacheTimeout: '300',
				enableCache: 'true'
			}
		}),
		
		// 模拟后端返回的数据
		backendData: {
			id: '123',
			name: '后端返回的连接器',
			type: 'MYSQL',
			description: '后端返回的数据',
			config: {
				host: 'backend-host',
				port: '3306',
				database: 'backend_db',
				username: 'backend_user',
				password: 'backend_pass'
			}
		}
	}
}

/**
 * 运行所有验证测试
 */
function runValidationTests() {
	console.log('🚀 开始运行数据连接器表单修改验证测试...\n')
	
	const testData = createTestData()
	const results = {
		newSubmit: [],
		oldSubmit: [],
		newOpen: [],
		newGetConfig: [],
		summary: { passed: 0, failed: 0 }
	}
	
	// 测试新版本提交方法
	console.log('📝 测试提交方法...')
	Object.keys(testData).forEach(key => {
		if (key !== 'backendData') {
			const result = mockNewOnSubmit(testData[key])
			results.newSubmit.push({ type: key, ...result })
			if (result.isValid) results.summary.passed++
			else results.summary.failed++
		}
	})
	
	console.log('\n')
	
	// 测试旧版本提交方法（对比）
	console.log('📝 测试旧版本提交方法（对比）...')
	const oldResult = mockOldOnSubmit(testData.mysql)
	results.oldSubmit.push(oldResult)
	
	console.log('\n')
	
	// 测试新版本数据回显方法
	console.log('📝 测试数据回显方法...')
	const openResult = mockNewOpen(testData.backendData)
	results.newOpen.push(openResult)
	if (openResult.isValid) results.summary.passed++
	else results.summary.failed++
	
	console.log('\n')
	
	// 测试新版本配置获取方法
	console.log('📝 测试配置获取方法...')
	const configTests = [
		{ modelValue: testData.externalAPI.value, key: 'baseUrl', defaultValue: '' },
		{ modelValue: testData.externalAPI.value, key: 'authType', defaultValue: 'NONE' },
		{ modelValue: testData.externalAPI.value, key: 'nonExistentKey', defaultValue: 'default' }
	]
	
	configTests.forEach(test => {
		const result = mockNewGetConfigValue(test.modelValue, test.key, test.defaultValue)
		results.newGetConfig.push({ ...test, ...result })
		if (result.isValid) results.summary.passed++
		else results.summary.failed++
	})
	
	console.log('\n')
	
	// 输出测试总结
	console.log('📊 测试总结:')
	console.log(`✅ 通过: ${results.summary.passed}`)
	console.log(`❌ 失败: ${results.summary.failed}`)
	console.log(`📈 成功率: ${((results.summary.passed / (results.summary.passed + results.summary.failed)) * 100).toFixed(1)}%`)
	
	const allPassed = results.summary.failed === 0
	console.log(`\n🎯 整体结果: ${allPassed ? '✅ 所有测试通过' : '❌ 存在失败的测试'}`)
	
	return { results, allPassed }
}

// 导出函数供外部使用
if (typeof module !== 'undefined' && module.exports) {
	module.exports = {
		runValidationTests,
		mockNewOnSubmit,
		mockOldOnSubmit,
		mockNewOpen,
		mockNewGetConfigValue,
		createTestData
	}
}

// 如果在浏览器环境中，自动运行测试
if (typeof window !== 'undefined') {
	// 延迟执行，确保页面加载完成
	setTimeout(() => {
		runValidationTests()
	}, 1000)
}

// 如果在Node.js环境中直接运行
if (typeof require !== 'undefined' && require.main === module) {
	runValidationTests()
}
